import os
from datetime import timedelta, datetime

import jwt
from flask import current_app
from jwt import PyJWTError

from models import UserModel

SECRET_KEY=os.urandom(16)   #生成一个随机数作为密钥
JWT_EXPIRY_SECOND=60*60 #TOKENDE 有效时间，一个小时

def generate_tokens(id,username,state):
    '''
    一个用户在一次会话生成一个token
    :param username: 用户名字
            id :用户id
    :return:
    '''
    # params：是生成token的参数
    params = {
        'id': id,
        'username':username,
        'state':state,
        # exp：代表token的有效时间,datetime.utcnow():代表当前时间
        # timedelta:表示转化为毫秒
        'exp': datetime.utcnow() + timedelta(seconds=JWT_EXPIRY_SECOND)
    }
    # key:secret_key
    # algorithm:算法，算法是SHA-256
    # SHA-256:密码散列函数算法.256字节长的哈希值（32个长度的数组）---》16进制字符串表示，长度为64。信息摘要，不可以逆
    return jwt.encode(payload=params, key=SECRET_KEY, algorithm='HS256')


def verify_tokens(token_str):
    '''
    验证token
    :param token_str:如果验证成功返回用户id
    :return:
    '''
    try:
        # 返回之前生成token的时候的字典，字典种包含id和exp
        data = jwt.decode(token_str, key=SECRET_KEY, algorithms='HS256')
        current_app.logger.info(data)
        user = UserModel.query.filter(UserModel.id == data['id']).first()
        if user and user.is_delete == 0:  # 如果用户存在，并且没有锁定
            return {'id': user.id,
                    'username':user.username,
                    'state':user.state}
        else:
            return {"message": "数据库中不存在当前用户，或者用户已经过期"}
    except PyJWTError as e:
        current_app.logger.error(e)
        return {"message": "token验证失败"}
